package cn.com.jsepc.rep.appframe;
import cn.com.jsepc.appframe.client.common.CommMessClient;
import cn.com.jsepc.appframe.system.AppframeOrgClient;
import cn.com.jsepc.appframe.system.AppframePermissionClient;
import cn.com.jsepc.appframe.system.domain.BaseOrg;
import cn.com.jsepc.appframe.system.domain.SpecialOrg;
import cn.com.jsepc.appframe.system.domain.SysFunc;
import cn.com.jsepc.appframe.system.domain.SysObject;
import cn.com.jsepc.appframe.system.domain.SysRole;
import cn.com.jsepc.appframe.system.domain.SysSpRole;
import cn.com.jsepc.appframe.system.domain.SysSystem;
import cn.com.jsepc.appframe.system.domain.User;
import cn.com.jsepc.appframe.system.service.AppframeOrg;
import cn.com.jsepc.appframe.system.service.AppframePermission;

public class AppframeProxyService {
//	系统编码
	public final static String SYS_CODE="REP";
	public final static String SYS_DEPLOY_CODE="REP";
	// 组织对象的类型：部门
	public final static String ORG_ATTRIBUTE_CODE_DEPT="DEPT";
	// 组织对象的类型：单位
	public final static String ORG_ATTRIBUTE_CODE_CORP="CORP";
	// 组织对象的类型：县公司
	public final static String ORG_ATTRIBUTE_CODE_D_CORP="D_CORP";
	// 组织对象的类型：市公司
	public final static String ORG_ATTRIBUTE_CODE_C_CORP="C_CORP";
	// 组织对象的类型：省公司
	public final static String ORG_ATTRIBUTE_CODE_P_CORP="P_CORP";	
		
	
	private AppframeOrg appframeOrg = AppframeOrgClient.getInstance();
	private AppframePermission appframePermission = AppframePermissionClient.getInstance();
	
	private AppframeProxyService(){
		
	}
	
	// 统一框架服务工厂实例
	private static AppframeProxyService appframeProxyService = null;
	/**
	 * 获得统一框架服务工厂实例
	 */
	public static AppframeProxyService getAppframeProxyService() {
		synchronized (AppframeProxyService.class) {
			if(appframeProxyService == null){
				appframeProxyService = new AppframeProxyService();
			}
		}
		return appframeProxyService;
	}
	
	public static String getSysCode() {
		return SYS_CODE;
	}

	/**
	 * 验证用户在某个对象上是否有使用权限
	 * @param userId
	 * @param systemCode
	 * @param funcBusicode
	 */
	public boolean checkPermission(Long userId,String funcBusicode,String objectBusicode) {
		return this.checkPermission(userId, funcBusicode, objectBusicode,null);
	}
	
	/**
	 * 验证用户在某个对象上是否有sporgId的使用权限
	 * @param userId
	 * @param systemCode
	 * @param funcBusicode
	 * @param sporgId
	 */
	public boolean checkPermission(Long userId,String funcBusicode,String objectBusicode,Long sporgId) {
		boolean hasPermission = true;
		if(appframePermission.hasPermission(userId, this.getSystemCode(), funcBusicode, objectBusicode, sporgId)) {
		} else {
			hasPermission = false;
		}
		return hasPermission;
	}
	
	/**
	 * 取得本系统CODE
	 * @return
	 */
	public String getSystemCode(){
		return getSysCode();
	}
	
	/**
	 * 取得用户在菜单上具备权限的业务组织角色
	 * @param funcBusicode
	 * @param userId
	 * @return
	 */
	public SysSpRole[] getUserSprolesOfFunc(String funcBusicode,Long userId){

		SysSpRole[] spRoles = appframePermission.getUserSprolesOfFunc(this.getSystemCode(), funcBusicode, userId);
		if(spRoles!=null&&spRoles.length>0){
			boolean aclIsToUser = false;
			for(int i = 0;i<spRoles.length;i++){
				//判断权限是否直接授给用户了
				if(spRoles[i]==null||spRoles[i].getId()==null||spRoles[i].getId().longValue()<1)
					aclIsToUser = true;
			}
			if(aclIsToUser){
				spRoles =  appframeOrg.getSpRolesByUser(userId, getSystemId());
			}
		}
		return spRoles;
		
	}
	
	/**
	 * 返回所在单位的组织
	 * @param orgId 所在单位ID
	 * @return
	 */
	public SpecialOrg getSpecialOrgsOfCorp(Long orgId){
		return appframeOrg.getSpecialOrgsOfCorp(orgId);
	}
	
	/**
	 * 获得用户有权限访问的对象列表
	 * @param userId
	 * @param sporgId
	 * @param funcBusicode
	 * @return
	 */
	public SysObject[] getUserInheritanceObjects(Long userId, Long sporgId, String funcBusicode){
		return appframePermission.getUserInheritanceObjects(userId,sporgId,this.getSystemCode(),funcBusicode);
	}
	
	/**
	 * 获得角色有权限访问的对象列表
	 * @param sproleId
	 * @param funcBusicode
	 * @return
	 */
	public SysObject[] getSprolePermitObjects(Long sproleId,String funcBusicode){
		return appframePermission.getSprolePermitObjects(sproleId, this.getSystemCode(), funcBusicode);
	}
	
	/**
	 * 根据用户ID取得用户信息
	 * @param userId
	 * @return
	 */
	public User getUserById(Long userId){
		return appframeOrg.getUserById(userId);
	}
	/**
	 * USERID转换成SYSDATAID,sysDataId与SAP中的用户编码一致,userId与统一权限编码一致
	 * @param userId
	 * @return
	 */
	public Long getSysDataIdByUserId(Long userId){
		User user = appframeOrg.getUserById(userId);
		if(user != null)
			return user.getSysDataId();
		else
			return -1L;
	}
	
	
	
	/**
	 * 取得系统ID
	 * @return
	 */
	public Long getSystemId() {
		return getSystem().getId();
	}
	
	/**
	 * 取得用户所有业务组织角色
	 * @param userId
	 * @return
	 */
	public SysSpRole[] getSpRolesByUser(Long userId){
		return appframeOrg.getSpRolesByUser(userId, getSystemId());
	}
	
	/**
	 * 取得用户指定业务组织角色的业务组织角色
	 * @param userId
	 * @param roleCode
	 * @return
	 */
	public SysSpRole getSpRolesByUserOfCode(Long userId, String roleCode){
		SysSpRole targetSpRole = null;
		SysSpRole[] spRoleArr = getSpRolesByUser(userId);
		for(int i=0;i<spRoleArr.length;i++){
			SysRole role = appframeOrg.getRoleById(spRoleArr[i].getRole_id());
			if(roleCode.equals(role.getCode())){
				targetSpRole =  spRoleArr[i];
				break;
			}
		}
		return targetSpRole;
	}
	
	/**
	 * 根据业务角色ID取得业务组织角色
	 * @param sproleId
	 * @return
	 */
	public SysSpRole[] getSpRolesByRole(Long roleId){
		return appframeOrg.getSpRolesByRole(roleId);
	}
	
	/**
	 * 根据业务组织角色ID取得业务组织角色
	 * @param sproleId
	 * @return
	 */
	public SysSpRole getSpRoleById(Long sproleId){
		return appframeOrg.getSpRoleById(sproleId);
	}
	
	/**
	 * 取业务组织单元下的所有业务组织角色列表
	 * @param specialOrgId
	 * @return
	 */
	public SysSpRole[] getSpRolesBySpecialOrg(Long specialOrgId){
		return appframeOrg.getSpRolesBySpecialOrg(specialOrgId, this.getSystemId());
	}
	/**
	 * 取业务组织单元下的所有业务组织角色列表
	 * @param specialOrgId
	 * @return
	 */
	public SysSpRole[] getSpRolesBySpecialOrg(Long specialOrgId, String roleCode){
		return appframeOrg.getSpRolesBySpecialOrg(specialOrgId, this.getSystemId(), roleCode);
	}
	
	/**
	 * 按照ID查询专项组织单元
	 * @param sporgId  专项组织单元id
	 * @return
	 */
	public SpecialOrg getSpecialOrgById(Long spOrgId) {
		return appframeOrg.getSpecialOrgById(spOrgId);
	}
	
	/**
	 * 返回上级单位
	 * @param orgId  组织单元id
	 * @return
	 */
	public SpecialOrg getParentSpecialOrgsOfCorp(Long spOrgId) {
		SpecialOrg corp  =  appframeOrg.getParentSpecialOrgsOfCorp(spOrgId);
		return corp;
	}
	

	
	/**
	 * 返回单位全路径，以"/"隔开
	 * @param orgId  组织单元id
	 * @return
	 */
	public String getSpecialOrgPath(Long spOrgId) {
		return appframeOrg.getSpecialOrgPath(spOrgId);
	}
	
	
	/**
	 * 返回业务组织机构直接上级 
	 * @param orgId  组织单元id
	 * @return
	 */
	public SpecialOrg getParentSpecialOrg(Long spOrgId) {
		return appframeOrg.getParentSpecialOrg(spOrgId);
	}
	
	/**
	 * 取业务组织单元的直接下级单元列表（如果orgId为Null，取根节点）
	 * @param orgId 业务组织单元ID
	 * @return 业务组织单元的直接下级单元列表
	 */
	public SpecialOrg[] getChildrenSpecialOrgs(Long orgId) {
		SpecialOrg[] children = null;
		children = appframeOrg.getChildrenSpecialOrgs(orgId);
		return children;
	}
	
		/**
	 * 取业务组织单元的直接下级单元列表（如果orgId为Null，取根节点）
	 * @param orgId 业务组织单元ID
	 * @return 业务组织单元的直接下级单元列表
	 */
	public SpecialOrg[] getRootSpecialOrgs() {
		return appframeOrg.getRootSpecialOrgs(getSystem().getOrg_type_id(), null);
	}
	
	public SysSystem getSystem() {
		return appframeOrg.getSystemByCode(getSystemCode());
	}
	/**
	 * 取业务组织单元下所有业务组织角色下的所有用户列表
	 * @param specialOrgId
	 * @return
	 */
	public User[] getUsersBySpecialOrg(Long specialOrgId){
		return appframeOrg.getUsersBySpecialOrg(specialOrgId, this.getSystemId());
	}
	
	/**
	 * 取业务组织单元下指定姓名的用户列表
	 * @param specialOrgId
	 * @return
	 */
	public User[] getUsersBySpecialOrg(Long specialOrgId, String name){
		return appframeOrg.getUsersBySpecialOrg(specialOrgId, this.getSystemId(),name);
	}
	
	/**
	 * 返回专项组织单元下指定角色的所有用户
	 * @param specialOrgId  专项组织单元id
	 * @param roleCode  角色code
	 * @return
	 */
	public User[] getUsersBySpecialOrgRole(Long specialOrgId, String roleCode){
		return appframeOrg.getUsersBySpecialOrgRole(specialOrgId, this.getSystemId(), roleCode);
	}
	/**
	 * 取业务组织角色下的所有用户列表
	 * @param sproleId
	 * @return
	 */
	public User[] getUsersBySpRole(Long sproleId){
		return appframeOrg.getUsersBySpRole(sproleId);
	}
	/**
	 * 发送消息 
	 *  @param Long sId:发送人的编号（必填）   从session 取得
 	 *	@param Long[] rIds：接收人的编号（可以群发，必填）
	 *	@param String title: 消息标题
 	 *	@param String content: 消息内容（必填）
	 *	@param String affix：消息附件（目前不提供此功能，值为“”）
 	 *	@param String sendTime:消息发送时间（值可为null或“”或为满足此格式的“yyyy-MM-dd hh:mm:ss”的具体的时间）
	 * 	@param String  messFlag:消息来源（0为系统消息，1为用户消息，必填） 
	 *	@param long callerId服务调用者ID：调用服务的用户ID，集成平台管理需要如果为0，缺省为所在系统
	 *	@return
	 */
	public void sendMessage(Long sId, Long rIds[], String title,String content,String affix, long callerId){
		String messFlag = null;
	
//		if (rIds.length == 1){
//			messFlag = "1";
//		} else {
			messFlag = "1";
//		}
		CommMessClient commMessClient=CommMessClient.getInstance();
		commMessClient.sendMess(sId, rIds, title, content, affix, "", messFlag, callerId);
	}
	
	/**
	 * 取基准组织单元的所在单位,如果orgId是单位则返回自身
	 * @param orgId 基准组织id
	 * @return
	 */
	public BaseOrg getBaseOrgOfCorp(Long orgId){
		return appframeOrg.getBaseOrgOfCorp(orgId);
		
	}
	
	/**
	 * 取基准组织单元在某业务系统关联的业务组织单元
	 * @param baseOrgId  基准组织单元id
	 * @return
	 */
	public SpecialOrg[] getSpecialOrgByBaseOrg(Long baseOrgId){
		return appframeOrg.getSpecialOrgByBaseOrg(baseOrgId, this.getSystemId());
	}
	
	/**
	 * 取基准组织单元在某业务系统关联的业务组织单元
	 * @param baseOrgId  基准组织单元id
	 * @return
	 */
	public SpecialOrg[] getSpecialOrgByBaseOrgOfSysDataId(Long baseOrgId){
		return appframeOrg.getSpecialOrgByBaseOrgOfSysDataId(baseOrgId, this.getSystemId());
	}
	

	/**
	 * 返回专项组织单元对应的基本组织单元
	 * @param specialOrgId  专项组织单元id
	 * @return
	 */
	public BaseOrg[] getBaseOrgsBySpecial(Long specialOrgId) {
		return appframeOrg.getBaseOrgsBySpecial(specialOrgId);
	}
	
	/**
	 * 返回专项组织单元的直接下级单位
	 * @param parentOrgId  上级id
	 * @return
	 */
	public SpecialOrg[] getChildrenSpecialOrgsOfCorp (Long parentOrgId) {
		return appframeOrg.getChildrenSpecialOrgsOfCorp(parentOrgId);
	}
	
	/**
	 * 返回专项组织单元的直接下级部门
	 * @param parentOrgId  上级id
	 * @return
	 */
	public SpecialOrg[] getChildrenSpecialOrgsOfDept (Long parentOrgId) {
		return appframeOrg.getChildrenSpecialOrgsOfDept(parentOrgId);
	}

	/**
	 * 返回专项组织单元的指定性质的第一个上级单元
	 * @param spOrgId
	 * @param orgAttrCode
	 * @return
	 */
	public SpecialOrg getParentSpecialOrg(long spOrgId,String orgAttrCode){
		return appframeOrg.getParentSpecialOrg(spOrgId, new String[]{orgAttrCode});
	}
	/**
	 * 取用户在系统下的所有缺省角色
	 * @param userId
	 * @return
	 */
	public SysSpRole[] getDefaultSprole(long userId){
		return appframeOrg.getDefaultSprole(userId, getSystemId());
	}
	
	/**
	 * 2010-10-28 增加方法
	 * 取得用户所有可以访问的功能菜单	 
	 * @param userId  用户id
	 * @param sporgId  专项组织单元id	允许为null
	 * @param systemCode  业务系统编码
	 * 
	 */
	public SysFunc[] getUserPermitFuncs(Long userId,Long sporgId,String systemCode){
		return appframePermission.getUserPermitFuncs(userId,sporgId,systemCode);
	}
	public static void main(String[] args) {
		AppframeProxyService service = AppframeProxyService.getAppframeProxyService();
		SysSpRole[] spRoles = service.getUserSprolesOfFunc("JHTJ_XMCB_QX",1000982l);
		SysObject[] objs = service.getSprolePermitObjects(spRoles[0].getId(),"JHTJ_XMCB_QX");
		System.out.println(spRoles.length);
		//消息发送测试
		//service.sendMessage(new Long(200092861), new Long[]{new Long(1001366),new Long(200092861)}, "测试1", "逗你玩", null, new Long(200092861));
	}
}